package arp.repository.springdatamongodb;

import org.springframework.data.mongodb.core.MongoTemplate;

import arp.repository.SimplePersistenceRepository;

public abstract class SimpleMappedMongodbRepository<E, T, I> extends
		SimplePersistenceRepository<E, I> {

	private MongoTemplate mongoTemplate;

	protected SimpleMappedMongodbRepository(MongoTemplate mongoTemplate) {
		if (mongoTemplate == null) {
			initAsMock();
		} else {
			this.mongoTemplate = mongoTemplate;
		}
	}

	@Override
	protected void updateImpl(I id, E entity) {
		T dto = toDTO(entity);
		mongoTemplate.save(dto);
	}

	protected abstract T toDTO(E entity);

	@Override
	protected E findByIdImpl(I id) {
		T dto = mongoTemplate.findById(id, getDtoClass());
		if (dto == null) {
			return null;
		}
		return toEntity(dto);
	}

	protected abstract E toEntity(T dto);

	protected abstract Class<T> getDtoClass();

	@Override
	protected void saveImpl(I id, E entity) {
		T dto = toDTO(entity);
		mongoTemplate.save(dto);
	}

	@Override
	protected void removeImpl(I id) {
		T dto = mongoTemplate.findById(id, getDtoClass());
		if (dto == null) {
			return;
		}
		mongoTemplate.remove(dto);
	}

}
